#   encoding:utf-8
"""
@ time:2025/6/26 11:54
@ Author: Lvbingqing
@ File: import_to_mysql.py
"""

import pandas as pd
import mysql.connector
from sqlalchemy import create_engine
from sqlalchemy.exc import SQLAlchemyError
import pymysql


def import_excel_to_mysql(file_path, table_name, db_config):
    try:
        # 读取Excel数据
        print(f"正在读取Excel文件: {file_path}")
        df = pd.read_excel(file_path)

        print(f"数据基本信息:")
        df.info()

        print(f"数据集行数和列数: {df.shape}")
        if df.empty:
            print("错误：Excel文件中没有数据！")
            return False

        # 创建数据库连接（使用pymysql驱动替代mysqlconnector）
        print(f"正在连接数据库: {db_config['host']}/{db_config['database']}")
        engine = create_engine(
            f"mysql+pymysql://{db_config['user']}:{db_config['password']}@{db_config['host']}/{db_config['database']}?charset=utf8mb4",
            pool_pre_ping=True  # 添加预ping功能，确保连接有效
        )

        # 将数据导入MySQL（分批次导入，减小内存压力）
        print(f"正在将数据导入表: {table_name}")
        chunksize = 500
        for i in range(0, len(df), chunksize):
            chunk = df.iloc[i:i + chunksize]
            chunk.to_sql(
                name=table_name,
                con=engine,
                if_exists='append' if i > 0 else 'replace',
                index=False
            )
            print(f"已导入 {i + chunksize if i + chunksize < len(df) else len(df)}/{len(df)} 条记录")

        print(f"数据导入成功！共导入 {len(df)} 条记录")
        return True

    except FileNotFoundError:
        print(f"错误：文件 '{file_path}' 不存在！")
        return False
    except SQLAlchemyError as e:
        print(f"数据库操作错误: {str(e)}")
        return False
    except Exception as e:
        print(f"发生未知错误: {str(e)}")
        return False


if __name__ == "__main__":
    # 数据库连接配置
    db_config = {
        'host': 'localhost',
        'user': 'root',
        'password': '123456',
        'database': 'airline_data'
    }

    # 执行导入
    import_excel_to_mysql(
        file_path='24年10-12月航空数据筛选.xlsx',
        table_name='flight_data',
        db_config=db_config
    )